# app.py
from controller.bg import work_order_controller
from controller.report import report_web_controller
from controller import web_controller, task_controller, generate_data_controller
from utils.common.init_app import app
from flask_restful import Api
from utils.common.db_connection import db
from utils.common.jwt_middleware import jwt
from exception.api_exception import APIException, HTTPException
from flask import jsonify
import urllib3
import env_config


# 全局错误AOP处理
# @app.errorhandler(Exception)
# def framework_error(e):
#     # api_logger.error("error info: %s" % e)  # 对错误进行日志记录
#     print(e)
#     if isinstance(e, APIException):
#         response = jsonify(e.to_dict())
#         response.status_code = e.code
#         return response
#     elif isinstance(e, HTTPException):
#         code = e.code
#         msg = e.description
#         # error_code = 9999
#         ne = APIException(msg, code)
#         response = jsonify(ne.to_dict())
#         response.status_code = e.code
#         return response
#     else:
#         ne = APIException("未知错误.", 9999)
#         response = jsonify(ne.to_dict())
#         return response


def create_app():
    # 初始化db
    app.config.from_mapping(env_config.config_mapping())
    db.app = app
    db.init_app(app)
    # 初始化jwt
    jwt.init_app(app)
    # 其他的app配置和定义

    api = Api(app)
    # 登录
    api.add_resource(web_controller.Login, '/api/v1/login')  # 登录
    api.add_resource(web_controller.Register, '/api/v1/register')  # 注册
    api.add_resource(web_controller.AuthResource, '/api/v1/auth_resource')  # 当前用户权限接口
    api.add_resource(web_controller.JwtTest, '/api/v1/jwt_test')  # jwt测试
    api.add_resource(web_controller.ModifyPwd, '/api/v1/modify_pwd')  # 修改密码

    # 后台管理接口
    api.add_resource(work_order_controller.GetDetails, '/bg/v1/details')  # 工单列表
    api.add_resource(work_order_controller.GetShops, '/bg/v1/shops')  # 查询商店
    api.add_resource(work_order_controller.CreateShop, '/bg/v1/create_shop')  # 创建商店
    api.add_resource(work_order_controller.DeleteShop, '/bg/v1/delete_shop')  # 删除商店
    api.add_resource(work_order_controller.GetUsingShops, '/bg/v1/get_using_shops')  # 获取商店下拉列表
    api.add_resource(work_order_controller.GetUsers, '/bg/v1/get_users')  # 获取人员下拉列表
    api.add_resource(work_order_controller.GetUsersMakeGet, '/bg/v1/get_users_make_get')  # 获取制单和接单人列表
    api.add_resource(work_order_controller.Submit, '/bg/v1/submit')  # 提交工单
    api.add_resource(work_order_controller.CreateOrder, '/bg/v1/create_order')  # 新建工单
    api.add_resource(work_order_controller.UserAuth, '/api/v1/user_auth')  # 用户权限
    # api.add_resource(work_order_controller.CreateOrderExtend, '/bg/v1/create_order_extend')  # 新建工单-录单人
    api.add_resource(work_order_controller.Chargeback, '/bg/v1/chargeback')  # 退款
    api.add_resource(work_order_controller.DocumentMakingBillboard, '/api/v1/document_making_billboard')  # 制单看板
    api.add_resource(work_order_controller.Dashboard, '/api/v1/dashboard')

    # 页面接口
    api.add_resource(work_order_controller.CreateVirtualOrder, '/api/v1/create_virtual_order')  # 新建虚拟工单
    api.add_resource(web_controller.Receiving, '/api/v1/receiving')  # 接单
    api.add_resource(web_controller.MakeData, '/api/v1/submit')  # 提交数据生成基础数据  -- deprecated
    # api.add_resource(web_controller.ExplainLink, '/api/v1/explain_link')  # 解析链接 -- deprecated
    api.add_resource(web_controller.ChangeOrderStatus, '/api/v1/modify_work_order')  # 修改工单信息 - 部分信息
    api.add_resource(web_controller.ChangeOrderInfo, '/api/v1/modify_order_info')  # 修改工单全部信息
    api.add_resource(web_controller.WorkOrderInfo, '/api/v1/work_order_info')  # 工单详情
    api.add_resource(web_controller.SearchResult, '/api/v1/search_result')  # 查询答案  -- deprecated
    api.add_resource(web_controller.InsertResult, '/api/v1/insert_result')  # 写入答案-外部不可用
    api.add_resource(web_controller.ModifyResultById, '/api/v1/save_result')  # 保存答案（修改答案）
    api.add_resource(web_controller.GetFrequency, '/api/v1/get_frequency')  # 查询频数分析结果

    # v2
    api.add_resource(web_controller.ReloadLink, '/api/v1/reload_link')  # 重新加载题目
    api.add_resource(web_controller.JudgeConfig, '/api/v1/judge_config')  # 校验配置
    api.add_resource(web_controller.ExplainLinkV2, '/api/v1/explain_link_v2')  # 解析链接_v2
    api.add_resource(web_controller.MakeDataV2, '/api/v1/submit_v2')  # 生成数据-基础数据-v2
    api.add_resource(web_controller.SearchResultV2, '/api/v1/search_result_v2')  # 查询答案-v2

    # 策略
    api.add_resource(web_controller.SaveProgrammeWeight, '/api/v1/save_programme_weight')  # 保存权重策略
    api.add_resource(web_controller.SearchProgrammeWeight, '/api/v1/search_programme_weight')  # 查询权重策略
    api.add_resource(web_controller.SaveProgramme, '/api/v1/save_programme')  # 保存方案策略
    api.add_resource(web_controller.SearchProgramme, '/api/v1/search_programme')  # 查询方案策略
    api.add_resource(web_controller.SearchRelationConfig, '/api/v1/search_relation_config')  # 查询相关性配置
    api.add_resource(web_controller.SearchSubmitConfig, '/api/v1/search_submit_config')  # 查询提交相关配置

    # 相关性
    api.add_resource(web_controller.Relation, '/api/v1/relation')  # 生成相关性基础数据及算法结果
    api.add_resource(web_controller.RelationStop, '/api/v1/relation_stop')  # 停止相关分析
    api.add_resource(web_controller.RelationCalculate, '/api/v1/relation_calculate')  # 仅计算相关性结果
    api.add_resource(web_controller.RelateTopic, '/api/v1/relate_topics')  # 获取数据库中的题目
    api.add_resource(web_controller.RelationConfirm, '/api/v1/relation_confirm')  # 确认当前结果到基础数据
    api.add_resource(web_controller.RelationAnalysisResult, '/api/v1/relation_analysis_result')  # 查询相关性分析结果

    # 提交任务
    api.add_resource(task_controller.BuildTasks, '/api/v1/send_results')  # 新建任务
    api.add_resource(task_controller.SearchTaskStatus, '/api/v1/search_task_status')  # 查询任务状态
    api.add_resource(task_controller.TaskStop, '/api/v1/stop_send_result')  # 停止任务
    api.add_resource(task_controller.SendStatus, '/api/v1/search_send_status')  # 查询任务状态
    api.add_resource(task_controller.Logs, '/api/v1/logs')  # 查询每一条记录的提交状态-日志
    api.add_resource(task_controller.ResendResults, '/api/v1/resend_results')  # 重新提交
    api.add_resource(task_controller.TaskFinished, '/api/v1/task_finished')  # 任务完成
    api.add_resource(task_controller.TaskWaitedSend, '/api/v1/task_waited_send')  # 任务待发送
    api.add_resource(task_controller.TaskFinishedTime, '/api/v1/task_finished_time')  # 任务完成时间

    # 上传下载文件
    api.add_resource(web_controller.UploadBaseResult, '/api/v1/upload_base_result')  # 上传基础数据结果
    api.add_resource(web_controller.ExportBaseResult, '/api/v1/export_base_result')  # 导出基础数据结果
    api.add_resource(web_controller.TestRedis, '/api/v1/test_redis')  # 导出基础数据结果

    # v2版本数据
    api.add_resource(generate_data_controller.SaveBaseConfig, '/api/v2/save_base_data')  # 保存基础配置
    api.add_resource(generate_data_controller.SearchBaseConfig, '/api/v2/search_base_data')  # 查询权重策略
    api.add_resource(generate_data_controller.GenerateData, '/api/v2/submit')  # 生成数据-基础数据-权重和方案一起生成
    api.add_resource(web_controller.PreviewLink, '/api/v2/preview_link')  # 预览链接
    api.add_resource(web_controller.ChangeWorkOrderSize, '/api/v2/change_work_order_size')  # 修改问卷的大小
    # api.add_resource(task_controller.Tasks, '/api/v2/tasks')  # 生成数据-基础数据-权重和方案一起生成

    # 报告相关接口
    api.add_resource(report_web_controller.UploadData, '/api/report/v1/upload_data')  # 上传文件 d
    api.add_resource(report_web_controller.DownloadData, '/api/report/v1/download_data')  # 下载文件 d
    api.add_resource(report_web_controller.TitleTid, '/api/report/v1/title_tid')  # 查询标题和tid映射配置 d
    api.add_resource(report_web_controller.Analysis, '/api/report/v1/analysis')  # 算法分析 - 预览，word流
    api.add_resource(report_web_controller.ExportReport, '/api/report/v1/export_report')  # 导出报告 - 导出文件
    api.add_resource(report_web_controller.SearchData, '/api/report/v1/search_data')  # 查询数据 d
    api.add_resource(report_web_controller.ModifyFileName, '/api/report/v1/modify_file_name')  # 修改文件名称 d
    api.add_resource(report_web_controller.DeleteFile, '/api/report/v1/delete_file')  # 删除文件 d
    api.add_resource(report_web_controller.List, '/api/report/v1/list')  # 列表 d
    api.add_resource(report_web_controller.RecordConfig, '/api/report/v1/record_config')  # 查询配置
    urllib3.disable_warnings()
    return app
